1 Firing rate of IL neurons during glycinergic fiber activation

In these experiments glycinergic fibers were photactivated while the firing rate of individual IL neurons was recorded. Some of the IL cells had very low baseline activity. In order to increase the firing rate of the IL neurons and to detect the effect of the glycinergic fiber activation a small tail pinch was applied. The firing rate of the recorded IL cells decreased during the glycinergic fiber activation.

1.1 Loading data

Loading AP and stimuli times from stimulus and from baseline data to IL_stim_firing and to IL_baseline_firing tables:

IL_stim_firing <- CreateRecTibble(AP_times = read_csv(file.path("data", 
    "IL_MFR", "stimulus", "AP_times.csv")), 
    stim_times = read_csv(file.path("data", 
        "IL_MFR", "stimulus", "stim_times.csv")))
IL_stim_firing %>% head()
IL_baseline_firing <- CreateRecTibble(
  AP_times = read_csv(file.path("data", "IL_MFR","baseline", "AP_times.csv")),
  stim_times = read_csv(file.path("data", "IL_MFR","baseline", "stim_times.csv"))
)
IL_stim_firing %>% head()



1.2 Summary information

Summary information of the stimulus and baseline recording files:

  • Variables:
    • file names (file_name)
    • number of channels in the raw recording files (No_ch)
    • number of APs (No_AP_unit, No_AP_unit2)
    • number of stimulus trains (No_Stim)
    • LFP sampling rate (samp_rate_lfp)
    • unit sampling rate (samp_rate_unit)
    • length of the recording (rec_length)
    • length of the stimulus trains (No_trains)
    • Are the lengths of the stimulus trains equal in the recording (train_length_equal)
    • starting time of the stimulus trains (train_start)
    • ending time of the stimulus trains (train_end)



CELL_INFO table to store the cell categories. It was created manually using the information from the summary excel table (Glicy_juxta-fm_exp_records_injection_sum.xls)

  • Variables
    • cell identification (cell_id). To find the recording file use the summary excel table
    • file names (file_name)
    • spontaneously active cells (bl_activity)
    • induced firing (pinch)
    • individually identified neurons (ident)
    • control cells (control)



1.3 Calculations

1.3.1 Firing rates

b_d_a_MFR: Calculating the number of APs -using a custom made function (BDACalculator)- before during and after the stimulus trains (b_d_a_MFR).

b_d_a_MFR <- lapply(CELL_INFO$cell_id, BDACalculator, data = IL_stim_firing) %>% 
  bind_rows() %>%  
  mutate(FR = No_AP / train_length) %>%
  dplyr::group_by(stim_cond, cell_id) %>%
  summarise(MFR = mean(FR))
`as.tibble()` is deprecated, use `as_tibble()` (but mind the new semantics).
This warning is displayed once per session.


sd_mean_isi: Calculating the baseline MFR of the recorded IL cells from the IL_baseline_firing table using a custom made function (SDMeanISI). The results are stored in the sd_mean_isi table.


1.3.2 Ranks (strength of inhibition)

cellranks: Calculating ranks based on the activity change from “baseline” to “during stimulus”. If the activity change is negative (decreased MFR) the asigned rank is negative, if it is positive (increased MFR) the assigned rank is positive.


Calculating the firing rate change during stimulus (photoactivation of the glycinergic fibers) compared to baseline:




\[\mathbf{activity\_change} = \frac{during\_MFR - base\_MFR}{base\_MFR} * 100\]

cellranks <- b_d_a_MFR %>% 
  group_by(stim_cond) %>%
  mutate(base_MFR = sd_mean_isi$MFR) %>% 
  mutate(activity_change = ((MFR-base_MFR)/base_MFR*100) %>% round(2)) %>% 
  dplyr::filter(stim_cond == "d") %>% 
  mutate(change_rank = ifelse(activity_change>0, 
                              rank(activity_change), 
                              -rank(-activity_change)) ) %>% 
  ungroup() %>% 
  left_join(CELL_INFO %>% 
              select(cell_id, control, pinch, position),
            by = "cell_id")
cellranks

cellranks_before_stim: Calculating ranks based on the activity change from “before stimulus” to “during stimulus”. If the activity change is negative (decreased MFR) the asigned rank is negative, if it is positive (increased MFR) the assigned rank is positive.


Calculating the firing rate change during stimulus (photoactivation of the glycinergic fibers) compared to before stimulus:




\[\mathbf{activity\_change} = \frac{during\_MFR - before\_MFR}{before\_MFR} * 100\]

cellranks_before_stim <- b_d_a_MFR %>% 
  spread(key = stim_cond,value = MFR) %>% 
  mutate(activity_change = ((d - b)/b*100) %>% round(2)) %>% 
  mutate(change_rank = ifelse(activity_change > 0, 
                              rank(activity_change), 
                              -rank(-activity_change))
         ) %>% 
  left_join(CELL_INFO %>% 
              select(cell_id, control, pinch, position),
            by = "cell_id")
cellranks_before_stim



1.3.3 Data to plot

TO_PLOT: Combining b_d_a_MFR (firing rate of 29 IL neurons b/d/a stim) with sd_mean_isi table (baseline firing rate of the same 29 neurons), joining with CELL_INFO containing important information of the cells (baseline activity, identified, pinched, control) and with cellranks containing the ranks asigned to each cells based on the changes in MFR during the stimulus compared to baseline.

TO_PLOT <- bind_rows(
  sd_mean_isi %>%
    select(MFR, cell_id, stim_cond),
  b_d_a_MFR
) %>% left_join(CELL_INFO %>% 
                  select(-file_name),
                by = "cell_id") %>% 
  left_join(cellranks %>% 
              select(cell_id, change_rank, activity_change), 
            by = "cell_id")

datatable(TO_PLOT,
          caption = "TO_PLOT table",
          rownames = TRUE, 
          options = list(pageLength = 50, scrollX=T, scrollY="500px",dom = 't'))



1.4 Plotting

1.4.1 Baseline vs. “before” stimulus activity

Comparison of baseline and “before” stimulus firing rates in the case of spontaneously active and sponteneously inactive (pinch) neurons. Spontaneously inactive neurons showed significantly higher MFR before stiulus compared to baseline.



1.4.2 MFR before, during and after stimulus



1.4.3 Strength of inhibition

Firing rate change during stimulus (photoactivation of the glycinergic fibers) compared to baseline:



Firing rate change during stimulus (photoactivation of the glycinergic fibers) compared to before stimulus:



Plotting the change in MFR from “baseline” to “during stimulus”. Coloring based on the strength of the inhibition (rank)













2 Activity of PRF glycinergic cells during PFC photoactivation

2.1 Loading and transforming (hidden code) data

source(file.path("supplementary_functions", "CreateRecTibble.R"))
RECORDINGS <- CreateRecTibble(
  AP_times = read_csv(file.path("data", "cortical_stim", "AP_times.csv")),
  stim_times = read_csv(file.path("data", "cortical_stim", "stim_times.csv"))
)

STIM_RESULTS <- read_csv(file.path("output_data", "cortical_stim_analysis.csv"))
  • List of tibbles used to store data:
    • RECORDINGS tibble: stores AP and stim time stamps, number of stimuli in each train, stimulus frequency categories (eg. 8 10 and 12 Hz belong to 10 Hz category)
    • STIM_RESULTS: stores the data for PSTHs

2.2 Plotting

2.2.1 Distribution of frist APs after cortical activation

3 Spontaneous desynchronization of the FC slow oscillation

file_to_load <- file_list[[1]]
filename <- as.character(substring(file_to_load, 1, nchar(file_to_load) - 4))
raw.rec <- readMat(file.path("data", file_to_load))

###takes the first AP (first row) and tells the index of point with the max value
points_to_peak <- which(raw.rec$ap[, , 1]$values[1, ] ==
    max(raw.rec$ap[, , 1]$values[1, ])) %>%
    as.numeric()

### time of the peak of the APs after its first point
raw.rec$ap[, , 1]$interval * points_to_peak
        [,1]
[1,] 0.00055
ap <- raw.rec$ap[, , 1]$times %>% as.double()
ap_peaks <- tibble(peak_times = (ap + c(raw.rec$ap[, , 1]$interval * points_to_peak)))

——- insert code here ——–

(spont_desynchron_analysis.R), 7 recordings

4 Terminals

4.1 Loading data

file_path <- file.path("data", 
    "Emi_terminals", "terminal_measures.csv")
TERMINALS <- read.table(file = file_path, 
    sep = ";", header = T, na.string = "na")
head(TERMINALS)
NA

4.2 Bouton area on different dendritic domains

4.3 Area of boutons with m2 and unknown origin

LS0tDQp0aXRsZTogIkZyb250YWwgY29ydGV4LWRyaXZlbiBnbHljaW5lcmdpYyBpbmhpYml0aW9uIG9mIHRoZSBpbnRyYWxhbWluYXIgdGhhbGFtdXMiDQphdXRob3I6ICJWaWt0b3IgUGxhdHRuZXIsIEVtaWxpYSBCb3N6LCBMYXN6bG8gQWNzYWR5Ig0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIGtlZXBfdGV4OiB0cnVlDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQpzcGFjaW5nOiBzaW5nbGUNCmZvbnRzaXplOiAxMnB0DQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQotLS0NCg0KDQoNCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KYm9keXsgLyogTm9ybWFsICAqLw0KICAgICAgZm9udC1zaXplOiAxNHB4Ow0KICAgICAgZm9udC1mYW1pbHk6ICJBcmlhbCIsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgfQ0KdGQgeyAgLyogVGFibGUgICovDQogIGZvbnQtc2l6ZTogMTJweDsNCn0NCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAzOHB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzRkNGU0ZjsNCn0NCmgxIHsgLyogSGVhZGVyIDEgKi8NCiAgZm9udC1zaXplOiAyOHB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzJjM2EzZTsNCn0NCmgyIHsgLyogSGVhZGVyIDIgKi8NCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzJjM2EzZTsNCn0NCmgzIHsgLyogSGVhZGVyIDMgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzJjM2EzZTsNCn0NCmNvZGUucnsgLyogQ29kZSBibG9jayAqLw0KICAgIGZvbnQtc2l6ZTogMTJweDsNCn0NCnByZSB7IC8qIENvZGUgYmxvY2sgLSBkZXRlcm1pbmVzIGNvZGUgc3BhY2luZyBiZXR3ZWVuIGxpbmVzICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KfQ0KPC9zdHlsZT4NCg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShSLm1hdGxhYikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGdncHVicikNCmxpYnJhcnkoc3R5bGVyKQ0KbGlicmFyeShmb3JtYXRSKQ0KDQpsaWJyYXJ5KGJzcGVjKSAjIyMgcG93ZXIgc3BlY3RydW0NCmxpYnJhcnkoV2F2ZWxldENvbXApICMjIyB3YXZlbGV0DQpsaWJyYXJ5KGRpcHRlc3QpICMjIyB0byB0ZXN0IGRpc3RyaWJ1dGlvbiB1bmkvbXVsdGltb2RhbGl0eSAoSVNJKQ0KbGlicmFyeShleGFjdFJhbmtUZXN0cykgIyMjIHdpbGNveC50ZXN0IGZvciB0aWVzDQpsaWJyYXJ5KFdhdmVsZXRDb21wKSAjIyMgd2F2ZWxldA0KbGlicmFyeShzaWduYWwpDQoNCmxpYnJhcnkoU1RBUikNCmxpYnJhcnkoc2VlKSAjZm9yIGhhbGYgdmlvbGlucGxvdA0KbGlicmFyeShnZ2hhbHZlcykgI2ZvciBoYWxmIHZpb2xpbnBsb3QNCg0Kc291cmNlKGZpbGUucGF0aCgic3VwcGxlbWVudGFyeV9mdW5jdGlvbnMiLCAiQ3JlYXRlUmVjVGliYmxlLlIiKSkNCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KHRpZHkgPSBUUlVFLCB0aWR5Lm9wdHMgPSBsaXN0KHdpZHRoLmN1dG9mZj0zMCkpDQpgYGANCg0KDQo8YnI+PGJyPg0KDQoNCg0KIyBGaXJpbmcgcmF0ZSBvZiBJTCBuZXVyb25zIGR1cmluZyBnbHljaW5lcmdpYyBmaWJlciBhY3RpdmF0aW9uDQoNCkluIHRoZXNlIGV4cGVyaW1lbnRzIGdseWNpbmVyZ2ljIGZpYmVycyB3ZXJlIHBob3RhY3RpdmF0ZWQgd2hpbGUgdGhlIGZpcmluZyByYXRlIG9mIGluZGl2aWR1YWwgSUwgbmV1cm9ucyB3YXMgcmVjb3JkZWQuIFNvbWUgb2YgdGhlIElMIGNlbGxzIGhhZCB2ZXJ5IGxvdyBiYXNlbGluZSBhY3Rpdml0eS4gSW4gb3JkZXIgdG8gaW5jcmVhc2UgdGhlIGZpcmluZyByYXRlIG9mIHRoZSBJTCBuZXVyb25zIGFuZCB0byBkZXRlY3QgdGhlIGVmZmVjdCBvZiB0aGUgZ2x5Y2luZXJnaWMgZmliZXIgYWN0aXZhdGlvbiBhIHNtYWxsIHRhaWwgcGluY2ggd2FzIGFwcGxpZWQuIFRoZSBmaXJpbmcgcmF0ZSBvZiB0aGUgcmVjb3JkZWQgSUwgY2VsbHMgZGVjcmVhc2VkIGR1cmluZyB0aGUgZ2x5Y2luZXJnaWMgZmliZXIgYWN0aXZhdGlvbi4gDQoNCg0KIyMgTG9hZGluZyBkYXRhDQoNCg0KTG9hZGluZyBBUCBhbmQgc3RpbXVsaSB0aW1lcyBmcm9tICpzdGltdWx1cyogYW5kIGZyb20gKmJhc2VsaW5lKiBkYXRhIHRvICoqSUxfc3RpbV9maXJpbmcqKiBhbmQgdG8gKipJTF9iYXNlbGluZV9maXJpbmcqKiB0YWJsZXM6DQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCB0aWR5PVRSVUV9DQpJTF9zdGltX2ZpcmluZyA8LSBDcmVhdGVSZWNUaWJibGUoICAgIA0KICBBUF90aW1lcyA9IHJlYWRfY3N2KGZpbGUucGF0aCgiZGF0YSIsICJJTF9NRlIiLCAic3RpbXVsdXMiLCAiQVBfdGltZXMuY3N2IikpLCAgDQogIHN0aW1fdGltZXMgPSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiSUxfTUZSIiwic3RpbXVsdXMiLCAic3RpbV90aW1lcy5jc3YiKSkNCikgDQpJTF9zdGltX2ZpcmluZyAlPiUgaGVhZCgpDQpgYGANCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpJTF9iYXNlbGluZV9maXJpbmcgPC0gQ3JlYXRlUmVjVGliYmxlKA0KICBBUF90aW1lcyA9IHJlYWRfY3N2KGZpbGUucGF0aCgiZGF0YSIsICJJTF9NRlIiLCJiYXNlbGluZSIsICJBUF90aW1lcy5jc3YiKSksDQogIHN0aW1fdGltZXMgPSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiSUxfTUZSIiwiYmFzZWxpbmUiLCAic3RpbV90aW1lcy5jc3YiKSkNCikNCklMX3N0aW1fZmlyaW5nICU+JSBoZWFkKCkNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyBTdW1tYXJ5IGluZm9ybWF0aW9uIA0KDQpTdW1tYXJ5IGluZm9ybWF0aW9uIG9mIHRoZSAqc3RpbXVsdXMqIGFuZCAgKmJhc2VsaW5lKiByZWNvcmRpbmcgZmlsZXM6DQoNCiogVmFyaWFibGVzOg0KICArIGZpbGUgbmFtZXMgKCpmaWxlX25hbWUqKQ0KICArIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgcmF3IHJlY29yZGluZyBmaWxlcyAoKk5vX2NoKikNCiAgKyBudW1iZXIgb2YgQVBzICgqTm9fQVBfdW5pdCosICpOb19BUF91bml0MiopDQogICsgbnVtYmVyIG9mIHN0aW11bHVzIHRyYWlucyAoKk5vX1N0aW0qKQ0KICArIExGUCBzYW1wbGluZyByYXRlICgqc2FtcF9yYXRlX2xmcCopDQogICsgdW5pdCBzYW1wbGluZyByYXRlICgqc2FtcF9yYXRlX3VuaXQqKQ0KICArIGxlbmd0aCBvZiB0aGUgcmVjb3JkaW5nICgqcmVjX2xlbmd0aCopDQogICsgbGVuZ3RoIG9mIHRoZSBzdGltdWx1cyB0cmFpbnMgKCpOb190cmFpbnMqKQ0KICArIEFyZSB0aGUgbGVuZ3RocyBvZiB0aGUgc3RpbXVsdXMgdHJhaW5zIGVxdWFsIGluIHRoZSByZWNvcmRpbmcgKCp0cmFpbl9sZW5ndGhfZXF1YWwqKQ0KICArIHN0YXJ0aW5nIHRpbWUgb2YgdGhlIHN0aW11bHVzIHRyYWlucyAoKnRyYWluX3N0YXJ0KikNCiAgKyBlbmRpbmcgdGltZSBvZiB0aGUgc3RpbXVsdXMgdHJhaW5zICgqdHJhaW5fZW5kKikNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRSB9DQoNCmluZm9fc3RpbSA8LSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiSUxfTUZSIiwgInN0aW11bHVzIiwgImZpbGVfaW5mby5jc3YiKSkNCmRhdGF0YWJsZShpbmZvX3N0aW0sIA0KICAgICAgICAgIGNhcHRpb24gPSJTdW1tYXJ5IHRhYmxlIG9mIHRoZSBzdGltdWx1cyByZWNvcmRpbmcgZmlsZXMgKGluZm9fc3RpbSkiLCANCiAgICAgICAgICByb3duYW1lcyA9IFRSVUUsIA0KICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWD1ULCBzY3JvbGxZID0gIjUwMHB4IiwgZG9tID0gJ3QnKSkNCmBgYA0KDQo8YnI+DQoNCmBgYHtyLG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRX0NCmluZm9fYmFzZWxpbmUgPC0gcmVhZF9jc3YoZmlsZS5wYXRoKCJkYXRhIiwgIklMX01GUiIsICJiYXNlbGluZSIsImZpbGVfaW5mby5jc3YiKSkNCmRhdGF0YWJsZShpbmZvX2Jhc2VsaW5lLCANCiAgICAgICAgICBjYXB0aW9uID0iU3VtbWFyeSB0YWJsZSBvZiB0aGUgYmFzZWxpbmUgcmVjb3JkaW5nIGZpbGVzIChpbmZvX2Jhc2VsaW5lKSIsDQogICAgICAgICAgcm93bmFtZXMgPSBUUlVFLCANCiAgICAgICAgICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNTAsIHNjcm9sbFg9VCwgc2Nyb2xsWT0iNTAwcHgiLGRvbSA9ICd0JykpICANCmBgYA0KPGJyPg0KDQoqKkNFTExfSU5GTyoqIHRhYmxlIHRvIHN0b3JlIHRoZSBjZWxsIGNhdGVnb3JpZXMuIEl0IHdhcyBjcmVhdGVkIG1hbnVhbGx5IHVzaW5nIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdW1tYXJ5IGV4Y2VsIHRhYmxlICgqR2xpY3lfanV4dGEtZm1fZXhwX3JlY29yZHNfaW5qZWN0aW9uX3N1bS54bHMqKQ0KDQoqIFZhcmlhYmxlcw0KICArIGNlbGwgaWRlbnRpZmljYXRpb24gKCpjZWxsX2lkKikuIFRvIGZpbmQgdGhlIHJlY29yZGluZyBmaWxlIHVzZSB0aGUgc3VtbWFyeSBleGNlbCB0YWJsZQ0KICArIGZpbGUgbmFtZXMgKCpmaWxlX25hbWUqKQ0KICArIHNwb250YW5lb3VzbHkgYWN0aXZlIGNlbGxzICgqYmxfYWN0aXZpdHkqKQ0KICArIGluZHVjZWQgZmlyaW5nICgqcGluY2gqKQ0KICArIGluZGl2aWR1YWxseSBpZGVudGlmaWVkIG5ldXJvbnMgKCppZGVudCopDQogICsgY29udHJvbCBjZWxscyAoKmNvbnRyb2wqKQ0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyMjIENFTEwgSU5GTyB0byBzdG9yZSBjYXRlZ29yaWVzIChzcG9udGFuZW91c2x5IGFjdGl2ZSwgaW5kdWNlZCBmaXJpbmcsIGlkZW50aWZpZWQpDQpDRUxMX0lORk8gPC0gaW5mb19iYXNlbGluZSAlPiUNCiAgc2VsZWN0KGZpbGVfbmFtZSkgJT4lDQogIGFkZF9jb2x1bW4oY2VsbF9pZCA9IHN1YnN0cihpbmZvX2Jhc2VsaW5lJGZpbGVfbmFtZSwgMSwgNiksIC5iZWZvcmUgPSAiZmlsZV9uYW1lIikgJT4lDQogIG11dGF0ZShibF9hY3Rpdml0eSA9IFQpICU+JQ0KICBtdXRhdGUoYmxfYWN0aXZpdHkgPSByZXBsYWNlKA0KICAgIGJsX2FjdGl2aXR5LCANCiAgICAuJGNlbGxfaWQgPT0gImNlbGwwNSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTAiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDEyIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxMyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTQiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDE1IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjQiLA0KICAgIEYNCiAgKSkgJT4lDQogIG11dGF0ZShwaW5jaCA9IFQpICU+JQ0KICBtdXRhdGUocGluY2ggPSByZXBsYWNlKA0KICAgIHBpbmNoLCANCiAgICAuJGNlbGxfaWQgPT0gImNlbGwwMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMDYiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDA3IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwwOCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTgiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDE5IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjEiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIzIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjUiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI2IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjgiLA0KICAgIEYNCiAgKSkgJT4lDQogbXV0YXRlKGlkZW50ID0gVCkgJT4lDQogIG11dGF0ZShpZGVudCA9IHJlcGxhY2UoDQogICAgaWRlbnQsDQogICAgLiRjZWxsX2lkID09ICJjZWxsMDYiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDA3IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTIiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDEzIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjEiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIyIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjQiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI1IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNiIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjciLA0KICAgIEYNCiAgKSkgJT4lIA0KICBtdXRhdGUoY29udHJvbCA9IEYpICU+JSANCiAgbXV0YXRlKGNvbnRyb2wgPSByZXBsYWNlKA0KICAgIGNvbnRyb2wsDQogICAgLiRjZWxsX2lkID09ICJjZWxsMjUiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI2IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjgiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI5IiwNCiAgICBUKSkgJT4lIA0KICBtdXRhdGUocG9zaXRpb24gPSAidW5rbm93biIpICU+JQ0KICBtdXRhdGUocG9zaXRpb24gPSByZXBsYWNlKA0KICAgIHBvc2l0aW9uLA0KICAgIC4kY2VsbF9pZCA9PSAiY2VsbDAxIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwwMiIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMDMiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDEwIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTQiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDE1IiwNCiAgICAiSUwiKSkgJT4lDQogIG11dGF0ZShwb3NpdGlvbiA9IHJlcGxhY2UoDQogICAgcG9zaXRpb24sDQogICAgLiRjZWxsX2lkID09ICJjZWxsMjAiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIxIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMiIsDQogICAgInRyYW5zaWVudCIpKSAlPiUgDQogIG11dGF0ZShwb3NpdGlvbiA9IHJlcGxhY2UoDQogICAgcG9zaXRpb24sDQogICAgLiRjZWxsX2lkID09ICJjZWxsMDgiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDE2IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxNyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjMiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI0IiwNCiAgICAiUEYiKSkNCg0KZGF0YXRhYmxlKENFTExfSU5GTywgDQogICAgICAgICAgY2FwdGlvbiA9ICJDRUxMX0lORk8gdGFibGUiLA0KICAgICAgICAgIHJvd25hbWVzID0gVFJVRSwgDQogICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDUwLCBzY3JvbGxYPVQsIHNjcm9sbFk9IjUwMHB4Iixkb20gPSAndCcpKSAgDQoNCiNJTF9zdGltX2ZpcmluZyRmaWxlX25hbWUgJT4lIHVuaXF1ZSgpICU+JSBsZW5ndGgoKQ0KI2luZm9fc3RpbSRmaWxlX25hbWUgJT4lIGxlbmd0aCgpDQpgYGANCg0KDQo8YnI+PGJyPg0KDQojIyBDYWxjdWxhdGlvbnMNCiMjIyBGaXJpbmcgcmF0ZXMNCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQojIyMgQ0FMQ1VMQVRJTkcgLS0tLS0tLS0NCg0KSUxfc3RpbV9maXJpbmcgPC0gbGVmdF9qb2luKElMX3N0aW1fZmlyaW5nLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3N0aW0gJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGZpbGVfbmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNfbGVuZ3RoLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWluX3N0YXJ0cywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbl9lbmRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWluX2xlbmd0aCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gImZpbGVfbmFtZSIpDQoNCiMjIyBjYWxjdWxhdGluZyBzdGltIHN0YXJ0IHRpbWVzIA0Kc3RhcnRfdGltZXMgPC0gSUxfc3RpbV9maXJpbmcgJT4lDQogIGdyb3VwX2J5KGZpbGVfbmFtZSkgJT4lDQogIHN1bW1hcmlzZSh0cmFpbl9zdGFydHMgPSB1bmlxdWUodHJhaW5fc3RhcnRzKSwgdHJhaW5fZW5kcyA9IHVuaXF1ZSh0cmFpbl9lbmRzKSkgJT4lDQogIG11dGF0ZShjZWxsX2lkID0gc3Vic3RyKGluZm9fc3RpbSRmaWxlX25hbWUsIDEsIDYpKSAlPiUNCiAgZ3JvdXBfYnkoY2VsbF9pZCkgJT4lDQogIHN1bW1hcmlzZSh0cmFpbl9zdGFydHMgPSB1bmlxdWUodHJhaW5fc3RhcnRzKSkgJT4lDQogIHB1bGwodHJhaW5fc3RhcnRzKSAlPiUNCiAgc3Ryc3BsaXQoIiwiKSAlPiUNCiAgc2V0X25hbWVzKHN1YnN0cihpbmZvX3N0aW0kZmlsZV9uYW1lLCAxLCA2KSkgJT4lDQogIGxhcHBseShhcy5udW1lcmljKQ0KDQojIyMgY2FsY3VsYXRpbmcgc3RpbSBlbmQgdGltZXMgDQplbmRfdGltZXMgPC0gSUxfc3RpbV9maXJpbmcgJT4lDQogIGdyb3VwX2J5KGZpbGVfbmFtZSkgJT4lDQogIHN1bW1hcmlzZSh0cmFpbl9zdGFydHMgPSB1bmlxdWUodHJhaW5fc3RhcnRzKSwgdHJhaW5fZW5kcyA9IHVuaXF1ZSh0cmFpbl9lbmRzKSkgJT4lDQogIG11dGF0ZShjZWxsX2lkID0gc3Vic3RyKGluZm9fc3RpbSRmaWxlX25hbWUsIDEsIDYpKSAlPiUNCiAgZ3JvdXBfYnkoY2VsbF9pZCkgJT4lDQogIHN1bW1hcmlzZSh0cmFpbl9lbmRzID0gdW5pcXVlKHRyYWluX2VuZHMpKSAlPiUNCiAgcHVsbCh0cmFpbl9lbmRzKSAlPiUNCiAgc3Ryc3BsaXQoIiwiKSAlPiUNCiAgc2V0X25hbWVzKHN1YnN0cihpbmZvX3N0aW0kZmlsZV9uYW1lLCAxLCA2KSkgJT4lDQogIGxhcHBseShhcy5udW1lcmljKQ0KDQoNCmNlbGxfbGlzdCA8LSBzdWJzdHIoaW5mb19zdGltJGZpbGVfbmFtZSwgMSwgNikNCkNFTExfSU5GTyRjZWxsX2lkDQpgYGANCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQojIyMgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgQVAgYi9kL2Egc3RpbS4gQXJndW1lbnRzOiBkYXRhIChJTF9zdGltX2ZpcmluZyB0YWJsZSB3aXRoIHJlY19sZW5ndGggYW5kIHN0aW11bHVzIHRyYWluIGluZm9ybWF0aW9uKQ0KQkRBQ2FsY3VsYXRvciA8LSBmdW5jdGlvbihkYXRhLCBsaXN0KSB7DQogIGNlbGxfbGlzdCA8LSBsaXN0DQogIA0KICAgIHRyYWluX2xlbmd0aCA8LSBkYXRhICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihzdWJzdHIoZmlsZV9uYW1lLCAxLCA2KSA9PSBjZWxsX2xpc3QpICU+JQ0KICAgICAgc2VsZWN0KHRyYWluX2xlbmd0aCkgJT4lDQogICAgICBwdWxsKCkgJT4lDQogICAgICBgW1tgKDEpDQogIA0KICANCiAgDQogIGlmICgNCiAgICAoZGF0YSAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoc3Vic3RyKGZpbGVfbmFtZSwgMSwgNikgPT0gY2VsbF9saXN0LCBzaWduYWxfdHlwZSA9PSAiQVAiKSAlPiUNCiAgICAgIHNlbGVjdCh1bml0X2lkKSAlPiUNCiAgICAgIHVuaXF1ZSgpICU+JQ0KICAgICAgcHVsbCgpICU+JQ0KICAgICAgbGVuZ3RoKCkpID09IDENCiAgKSB7DQogICAgIyMjIEluIGNhc2Ugb2Ygb25lIHVuaXQgaW4gdGhlIGZpbGU6DQogICAgQVBfdGltZXMgPC0gZGF0YSAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoc3Vic3RyKGZpbGVfbmFtZSwgMSwgNikgPT0gY2VsbF9saXN0LCBzaWduYWxfdHlwZSA9PSAiQVAiKSAlPiUNCiAgICAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICAgICBwdWxsKCkNCiAgICANCiAgICBBUF9udW1iZXJzIDwtIG1hdHJpeCgwLCBucm93ID0gbGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSksIG5jb2wgPSAzKQ0KICAgIGNvbG5hbWVzKEFQX251bWJlcnMpIDwtIGMoImIiLCAiZCIsICJhIikNCg0KICAgIGZvciAodHJhaW5fbnVtIGluIDE6bGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSkpIHsNCiAgICAgICMjIyBiZWZvcmUNCiAgICAgIEFQX251bWJlcnNbdHJhaW5fbnVtLCAxXSA8LSBsZW5ndGgoQVBfdGltZXNbc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gLSB0cmFpbl9sZW5ndGgNCiAgICAgIDwgQVBfdGltZXMgJiBBUF90aW1lcyA8IHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dXSkNCg0KICAgICAgIyMjIGR1cmluZw0KICAgICAgQVBfbnVtYmVyc1t0cmFpbl9udW0sIDJdIDwtIGxlbmd0aChBUF90aW1lc1tBUF90aW1lcyA+IHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dICYgQVBfdGltZXMgPCBlbmRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV1dKQ0KDQogICAgICAjIyMgYWZ0ZXINCiAgICAgIEFQX251bWJlcnNbdHJhaW5fbnVtLCAzXSA8LSBsZW5ndGgoQVBfdGltZXNbQVBfdGltZXMgPiBlbmRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gJg0KICAgICAgICBBUF90aW1lcyA8IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSArIHRyYWluX2xlbmd0aF0pDQogICAgfQ0KICAgIA0KICAgIG1lbHQoQVBfbnVtYmVycywgdmFybmFtZXMgPSBjKCJ0cmFpbiIsICJzdGltX2NvbmQiKSwgdmFsdWUubmFtZSA9ICJOb19BUCIpICU+JQ0KICAgICAgYXMudGliYmxlKCkgJT4lDQogICAgICBhZGRfY29sdW1uKGNlbGxfaWQgPSBjZWxsX2xpc3QpICU+JSANCiAgICAgIGFkZF9jb2x1bW4odHJhaW5fbGVuZ3RoID0gdHJhaW5fbGVuZ3RoKQ0KICAgIA0KICAgIA0KICB9IGVsc2UgeyANCiAgICAjIyMgaW4gY2FzZSBvZiBtdWx0aXBsZSB1bml0cyBpbiB0aGUgZmlsZToNCiAgICBBUF90aW1lc18xIDwtIGRhdGEgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN1YnN0cihmaWxlX25hbWUsIDEsIDYpID09IGNlbGxfbGlzdCwgc2lnbmFsX3R5cGUgPT0gIkFQIiwgdW5pdF9pZCA9PSAxKSAlPiUNCiAgICAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICAgICBwdWxsKCkNCiAgICANCiAgICBBUF9udW1iZXJzXzEgPC0gbWF0cml4KDAsIG5yb3cgPSBsZW5ndGgoc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dKSwgbmNvbCA9IDMpDQogICAgY29sbmFtZXMoQVBfbnVtYmVyc18xKSA8LSBjKCJiIiwgImQiLCAiYSIpDQogICAgDQogICAgZm9yICh0cmFpbl9udW0gaW4gMTpsZW5ndGgoc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dKSkgew0KICAgICAgIyMjIGJlZm9yZQ0KICAgICAgQVBfbnVtYmVyc18xW3RyYWluX251bSwgMV0gPC0gbGVuZ3RoKEFQX3RpbWVzXzFbc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gLSB0cmFpbl9sZW5ndGgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCBBUF90aW1lc18xICYgQVBfdGltZXNfMSA8IHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dXSkNCiAgICAgIA0KICAgICAgIyMjIGR1cmluZw0KICAgICAgQVBfbnVtYmVyc18xW3RyYWluX251bSwgMl0gPC0gbGVuZ3RoKEFQX3RpbWVzXzFbQVBfdGltZXNfMSA+IHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQX3RpbWVzXzEgPCBlbmRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV1dKQ0KICAgICAgDQogICAgICAjIyMgYWZ0ZXINCiAgICAgIEFQX251bWJlcnNfMVt0cmFpbl9udW0sIDNdIDwtIGxlbmd0aChBUF90aW1lc18xW0FQX3RpbWVzXzEgPiBlbmRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUF90aW1lc18xIDwgZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dICsgdHJhaW5fbGVuZ3RoXSkNCiAgICB9DQogICAgDQogICAgDQogICAgQVBfdGltZXNfMiA8LSBkYXRhICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihzdWJzdHIoZmlsZV9uYW1lLCAxLCA2KSA9PSBjZWxsX2xpc3QsIHNpZ25hbF90eXBlID09ICJBUCIsIHVuaXRfaWQgPT0gMikgJT4lDQogICAgICBzZWxlY3Qoc2lnbmFsX3RpbWUpICU+JQ0KICAgICAgcHVsbCgpDQogICAgDQogICAgQVBfbnVtYmVyc18yIDwtIG1hdHJpeCgwLCBucm93ID0gbGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSksIG5jb2wgPSAzKQ0KICAgIGNvbG5hbWVzKEFQX251bWJlcnNfMikgPC0gYygiYiIsICJkIiwgImEiKQ0KICAgIA0KICAgIGZvciAodHJhaW5fbnVtIGluIDE6bGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSkpIHsNCiAgICAgICMjIyBiZWZvcmUNCiAgICAgIEFQX251bWJlcnNfMlt0cmFpbl9udW0sIDFdIDwtIGxlbmd0aChBUF90aW1lc18yW3N0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dIC0gdHJhaW5fbGVuZ3RoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IEFQX3RpbWVzXzIgJiBBUF90aW1lc18yIDwgc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV1dKQ0KICAgICAgDQogICAgICAjIyMgZHVyaW5nDQogICAgICBBUF9udW1iZXJzXzJbdHJhaW5fbnVtLCAyXSA8LSBsZW5ndGgoQVBfdGltZXNfMltBUF90aW1lc18yID4gc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBfdGltZXNfMiA8IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXV0pDQogICAgICANCiAgICAgICMjIyBhZnRlcg0KICAgICAgQVBfbnVtYmVyc18yW3RyYWluX251bSwgM10gPC0gbGVuZ3RoKEFQX3RpbWVzXzJbQVBfdGltZXNfMiA+IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQX3RpbWVzXzIgPCBlbmRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gKyB0cmFpbl9sZW5ndGhdKQ0KICAgIH0NCiAgICANCiAgICANCiAgICANCiAgICBpZiAoY2VsbF9saXN0ICU+JSBzdWJzdHIoNSw2KSAlPiUgYXMubnVtZXJpYygpICU+JSBuY2hhcigpID09IDEpIHsNCiAgICAgIG5ld19uYW1lIDwtIHBhc3RlMCgNCiAgICAgICAgImNlbGwwIiwNCiAgICAgICAgY2VsbF9saXN0ICU+JSBzdWJzdHIoNSw2KSAlPiUgYXMubnVtZXJpYygpICsgMQ0KICAgICAgKQ0KICAgIH0gDQogICAgICANCiAgICBpZiAoY2VsbF9saXN0ICU+JSBzdWJzdHIoNSw2KSAlPiUgYXMubnVtZXJpYygpICU+JSBuY2hhcigpID09IDIpIHsNCiAgICAgIG5ld19uYW1lIDwtIHBhc3RlMCgNCiAgICAgICAgImNlbGwiLA0KICAgICAgICBjZWxsX2xpc3QgJT4lIHN1YnN0cig1LDYpICU+JSBhcy5udW1lcmljKCkgKyAxDQogICAgICApDQogICAgfQ0KICAgIA0KICAgIGJpbmRfcm93cygNCiAgICAgIG1lbHQoQVBfbnVtYmVyc18xLCB2YXJuYW1lcyA9IGMoInRyYWluIiwgInN0aW1fY29uZCIpLCB2YWx1ZS5uYW1lID0gIk5vX0FQIikgJT4lDQogICAgICAgIGFzLnRpYmJsZSgpICU+JQ0KICAgICAgICBhZGRfY29sdW1uKGNlbGxfaWQgPSBjZWxsX2xpc3QpICU+JSANCiAgICAgICAgYWRkX2NvbHVtbih0cmFpbl9sZW5ndGggPSB0cmFpbl9sZW5ndGgpLA0KICAgICAgDQogICAgICBtZWx0KEFQX251bWJlcnNfMiwgdmFybmFtZXMgPSBjKCJ0cmFpbiIsICJzdGltX2NvbmQiKSwgdmFsdWUubmFtZSA9ICJOb19BUCIpICU+JQ0KICAgICAgICBhcy50aWJibGUoKSAlPiUNCiAgICAgICAgYWRkX2NvbHVtbihjZWxsX2lkID0gbmV3X25hbWUpICU+JSANCiAgICAgICAgYWRkX2NvbHVtbih0cmFpbl9sZW5ndGggPSB0cmFpbl9sZW5ndGgpDQogICAgKQ0KICAgfSNlbHNlDQoNCn0jZm9vDQpgYGANCg0KKipiX2RfYV9NRlIqKjogQ2FsY3VsYXRpbmcgdGhlIG51bWJlciBvZiBBUHMgLXVzaW5nIGEgY3VzdG9tIG1hZGUgZnVuY3Rpb24gKCpCREFDYWxjdWxhdG9yKiktIGJlZm9yZSBkdXJpbmcgYW5kIGFmdGVyIHRoZSBzdGltdWx1cyB0cmFpbnMgKCpiX2RfYV9NRlIqKS4gDQoNCmBgYHtyfQ0KYl9kX2FfTUZSIDwtIGxhcHBseShDRUxMX0lORk8kY2VsbF9pZCwgQkRBQ2FsY3VsYXRvciwgZGF0YSA9IElMX3N0aW1fZmlyaW5nKSAlPiUgDQogIGJpbmRfcm93cygpICU+JSAgDQogIG11dGF0ZShGUiA9IE5vX0FQIC8gdHJhaW5fbGVuZ3RoKSAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KHN0aW1fY29uZCwgY2VsbF9pZCkgJT4lDQogIHN1bW1hcmlzZShNRlIgPSBtZWFuKEZSKSkNCmBgYA0KDQo8YnI+DQoqKnNkX21lYW5faXNpKio6IENhbGN1bGF0aW5nIHRoZSBiYXNlbGluZSBNRlIgb2YgdGhlIHJlY29yZGVkIElMIGNlbGxzIGZyb20gdGhlICpJTF9iYXNlbGluZV9maXJpbmcqIHRhYmxlIHVzaW5nIGEgY3VzdG9tIG1hZGUgZnVuY3Rpb24gKCpTRE1lYW5JU0kqKS4gVGhlIHJlc3VsdHMgYXJlIHN0b3JlZCBpbiB0aGUgKnNkX21lYW5faXNpKiB0YWJsZS4NCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQpJTF9iYXNlbGluZV9maXJpbmcgPC0gbGVmdF9qb2luKElMX2Jhc2VsaW5lX2ZpcmluZywNCiAgaW5mb19iYXNlbGluZSAlPiUNCiAgICBzZWxlY3QoZmlsZV9uYW1lLCByZWNfbGVuZ3RoKSwNCiAgYnkgPSAiZmlsZV9uYW1lIg0KKSAlPiUNCiAgbXV0YXRlKHN0aW1fY29uZCA9ICJiYXNlbGluZSIpDQoNCiMjIyBmdW5jdGlvbiB0byBjYWxjdWxhdGUgSVNJIG1lYW4gYW5kIFNEIGR1cmluZyBiYXNlbGluZSBhY3Rpdml0eSBvZiB0aGUgY2VsbHMNClNETWVhbklTSSA8LSBmdW5jdGlvbihmX25hbWUpIHsNCg0KDQogICMgbWVhbl9pc2kgPC0gSUxfYmFzZWxpbmVfZmlyaW5nICU+JQ0KICAjICAgZHBseXI6OmZpbHRlcihmaWxlX25hbWUgPT0gZl9uYW1lLCBzaWduYWxfdHlwZSA9PSAiQVAiKSAlPiUNCiAgIyAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICMgICBwdWxsKCkgJT4lDQogICMgICBkaWZmKCkgJT4lDQogICMgICBtZWFuKCkgKiAxMDAwICU+JQ0KICAjICAgYG5hbWVzPC1gKGZfbmFtZSkNCiAgIw0KICAjIHNkX2lzaSA8LSBJTF9iYXNlbGluZV9maXJpbmcgJT4lDQogICMgICBkcGx5cjo6ZmlsdGVyKGZpbGVfbmFtZSA9PSBmX25hbWUsIHNpZ25hbF90eXBlID09ICJBUCIpICU+JQ0KICAjICAgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUNCiAgIyAgIHB1bGwoKSAlPiUNCiAgIyAgIGRpZmYoKSAlPiUNCiAgIyAgIHNkKCkgKiAxMDAwICU+JQ0KICAjICAgYG5hbWVzPC1gKGZfbmFtZSkNCiAgIw0KICAjIHJldHVybihsaXN0KE1GUiA9IG1lYW5faXNpLA0KICAjICAgICAgICAgICAgIFNERlIgPSBzZF9pc2kpKQ0KDQogIHRtcDIgPC0gSUxfYmFzZWxpbmVfZmlyaW5nICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoZmlsZV9uYW1lID09IGZfbmFtZSwgc2lnbmFsX3R5cGUgPT0gIkFQIikgJT4lDQogICAgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUNCiAgICBwdWxsKCkgJT4lDQogICAgZGlmZigpICU+JQ0KICAgIG1lYW4oKSAqIDEwMDAgJT4lDQogICAgICB0aWJibGUobWVhbl9pc2kgPSAuKQ0KICB0bXAyICU+JQ0KICAgIG11dGF0ZShzZF9pc2kgPSBJTF9iYXNlbGluZV9maXJpbmcgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZpbGVfbmFtZSA9PSBmX25hbWUsIHNpZ25hbF90eXBlID09ICJBUCIpICU+JQ0KICAgICAgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUNCiAgICAgIHB1bGwoKSAlPiUNCiAgICAgIGRpZmYoKSAlPiUNCiAgICAgIHNkKCkgKiAxMDAwKSAlPiUNCiAgICBtdXRhdGUoZmlsZV9uYW1lID0gZl9uYW1lKQ0KfQ0KDQpzZF9tZWFuX2lzaSA8LSBsYXBwbHkoaW5mb19iYXNlbGluZSRmaWxlX25hbWUsIFNETWVhbklTSSkgJT4lIA0KICBiaW5kX3Jvd3MoKSAlPiUgDQogIGFzLnRpYmJsZSgpDQoNCnNkX21lYW5faXNpIDwtIHNkX21lYW5faXNpICU+JQ0KICBtdXRhdGUoY2VsbF9pZCA9IHN1YnN0cihzZF9tZWFuX2lzaSRmaWxlX25hbWUsIDEsIDYpKSAlPiUNCiAgbXV0YXRlKE1GUiA9IDEwMDAgLyBtZWFuX2lzaSkgJT4lDQogIG11dGF0ZShTRF9GUiA9IDEwMDAgLyBzZF9pc2kpICU+JQ0KICBtdXRhdGUoTUZSX2luYyA9IE1GUiArIFNEX0ZSKSAlPiUNCiAgbXV0YXRlKE1GUl9kZWMgPSBNRlIgLSBTRF9GUikgJT4lDQogICMgbXV0YXRlKE1GUl9pbmMgPSAxMDAwLyhtZWFuX2lzaS1zZF9pc2kpKSAlPiUNCiAgIyBtdXRhdGUoTUZSX2RlYyA9IDEwMDAvKG1lYW5faXNpK3NkX2lzaSkpICU+JQ0KICBtdXRhdGUoc3RpbV9jb25kID0gImJhc2VsaW5lIikgJT4lDQogIG11dGF0ZShNRlJfZGVjID0gcmVwbGFjZShNRlJfZGVjLCBzZF9tZWFuX2lzaSRNRlJfZGVjIDwgMCwgMCkpDQpgYGANCjxicj4NCg0KIyMjIFJhbmtzIChzdHJlbmd0aCBvZiBpbmhpYml0aW9uKQ0KKipjZWxscmFua3MqKjogQ2FsY3VsYXRpbmcgcmFua3MgYmFzZWQgb24gdGhlIGFjdGl2aXR5IGNoYW5nZSBmcm9tICIqYmFzZWxpbmUqIiB0byAiKmR1cmluZyBzdGltdWx1cyoiLiBJZiB0aGUgYWN0aXZpdHkgY2hhbmdlIGlzIG5lZ2F0aXZlIChkZWNyZWFzZWQgTUZSKSB0aGUgYXNpZ25lZCByYW5rIGlzIG5lZ2F0aXZlLCBpZiBpdCBpcyBwb3NpdGl2ZSAoaW5jcmVhc2VkIE1GUikgdGhlIGFzc2lnbmVkIHJhbmsgaXMgcG9zaXRpdmUuDQoNCjxicj4NCg0KQ2FsY3VsYXRpbmcgdGhlIGZpcmluZyByYXRlIGNoYW5nZSBkdXJpbmcgc3RpbXVsdXMgKHBob3RvYWN0aXZhdGlvbiBvZiB0aGUgZ2x5Y2luZXJnaWMgZmliZXJzKSBjb21wYXJlZCB0byBiYXNlbGluZToNCg0KPGJyPjxicj48YnI+DQoNCiQkXG1hdGhiZnthY3Rpdml0eVxfY2hhbmdlfSA9IFxmcmFje2R1cmluZ1xfTUZSIC0gYmFzZVxfTUZSfXtiYXNlXF9NRlJ9ICogMTAwJCQNCjxicj4NCg0KYGBge3J9DQpjZWxscmFua3MgPC0gYl9kX2FfTUZSICU+JSANCiAgZ3JvdXBfYnkoc3RpbV9jb25kKSAlPiUNCiAgbXV0YXRlKGJhc2VfTUZSID0gc2RfbWVhbl9pc2kkTUZSKSAlPiUgDQogIG11dGF0ZShhY3Rpdml0eV9jaGFuZ2UgPSAoKE1GUi1iYXNlX01GUikvYmFzZV9NRlIqMTAwKSAlPiUgcm91bmQoMikpICU+JSANCiAgZHBseXI6OmZpbHRlcihzdGltX2NvbmQgPT0gImQiKSAlPiUgDQogIG11dGF0ZShjaGFuZ2VfcmFuayA9IGlmZWxzZShhY3Rpdml0eV9jaGFuZ2U+MCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5rKGFjdGl2aXR5X2NoYW5nZSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJhbmsoLWFjdGl2aXR5X2NoYW5nZSkpICkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBsZWZ0X2pvaW4oQ0VMTF9JTkZPICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGNlbGxfaWQsIGNvbnRyb2wsIHBpbmNoLCBwb3NpdGlvbiksDQogICAgICAgICAgICBieSA9ICJjZWxsX2lkIikNCmNlbGxyYW5rcw0KYGBgDQoNCg0KDQoqKmNlbGxyYW5rc19iZWZvcmVfc3RpbSoqOiBDYWxjdWxhdGluZyByYW5rcyBiYXNlZCBvbiB0aGUgYWN0aXZpdHkgY2hhbmdlIGZyb20gIipiZWZvcmUgc3RpbXVsdXMqIiB0byAiKmR1cmluZyBzdGltdWx1cyoiLiBJZiB0aGUgYWN0aXZpdHkgY2hhbmdlIGlzIG5lZ2F0aXZlIChkZWNyZWFzZWQgTUZSKSB0aGUgYXNpZ25lZCByYW5rIGlzIG5lZ2F0aXZlLCBpZiBpdCBpcyBwb3NpdGl2ZSAoaW5jcmVhc2VkIE1GUikgdGhlIGFzc2lnbmVkIHJhbmsgaXMgcG9zaXRpdmUuDQoNCjxicj4NCg0KQ2FsY3VsYXRpbmcgdGhlIGZpcmluZyByYXRlIGNoYW5nZSBkdXJpbmcgc3RpbXVsdXMgKHBob3RvYWN0aXZhdGlvbiBvZiB0aGUgZ2x5Y2luZXJnaWMgZmliZXJzKSBjb21wYXJlZCB0byBiZWZvcmUgc3RpbXVsdXM6DQoNCjxicj48YnI+PGJyPg0KDQokJFxtYXRoYmZ7YWN0aXZpdHlcX2NoYW5nZX0gPSBcZnJhY3tkdXJpbmdcX01GUiAtIGJlZm9yZVxfTUZSfXtiZWZvcmVcX01GUn0gKiAxMDAkJA0KPGJyPg0KDQoNCg0KYGBge3J9DQpjZWxscmFua3NfYmVmb3JlX3N0aW0gPC0gYl9kX2FfTUZSICU+JSANCiAgc3ByZWFkKGtleSA9IHN0aW1fY29uZCx2YWx1ZSA9IE1GUikgJT4lIA0KICBtdXRhdGUoYWN0aXZpdHlfY2hhbmdlID0gKChkIC0gYikvYioxMDApICU+JSByb3VuZCgyKSkgJT4lIA0KICBtdXRhdGUoY2hhbmdlX3JhbmsgPSBpZmVsc2UoYWN0aXZpdHlfY2hhbmdlID4gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5rKGFjdGl2aXR5X2NoYW5nZSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJhbmsoLWFjdGl2aXR5X2NoYW5nZSkpDQogICAgICAgICApICU+JSANCiAgbGVmdF9qb2luKENFTExfSU5GTyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChjZWxsX2lkLCBjb250cm9sLCBwaW5jaCwgcG9zaXRpb24pLA0KICAgICAgICAgICAgYnkgPSAiY2VsbF9pZCIpDQpjZWxscmFua3NfYmVmb3JlX3N0aW0NCmBgYA0KDQoNCg0KPGJyPjxicj4NCg0KIyMjIERhdGEgdG8gcGxvdA0KKipUT19QTE9UKio6IENvbWJpbmluZyAqYl9kX2FfTUZSKiAoZmlyaW5nIHJhdGUgb2YgMjkgSUwgbmV1cm9ucyBiL2QvYSBzdGltKSB3aXRoICpzZF9tZWFuX2lzaSogdGFibGUgKGJhc2VsaW5lIGZpcmluZyByYXRlIG9mIHRoZSBzYW1lIDI5IG5ldXJvbnMpLCBqb2luaW5nIHdpdGggQ0VMTF9JTkZPIGNvbnRhaW5pbmcgaW1wb3J0YW50IGluZm9ybWF0aW9uIG9mIHRoZSBjZWxscyAoYmFzZWxpbmUgYWN0aXZpdHksIGlkZW50aWZpZWQsIHBpbmNoZWQsIGNvbnRyb2wpIGFuZCB3aXRoICpjZWxscmFua3MqIGNvbnRhaW5pbmcgdGhlIHJhbmtzIGFzaWduZWQgdG8gZWFjaCBjZWxscyBiYXNlZCBvbiB0aGUgY2hhbmdlcyBpbiBNRlIgZHVyaW5nIHRoZSBzdGltdWx1cyBjb21wYXJlZCB0byBiYXNlbGluZS4NCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpUT19QTE9UIDwtIGJpbmRfcm93cygNCiAgc2RfbWVhbl9pc2kgJT4lDQogICAgc2VsZWN0KE1GUiwgY2VsbF9pZCwgc3RpbV9jb25kKSwNCiAgYl9kX2FfTUZSDQopICU+JSBsZWZ0X2pvaW4oQ0VMTF9JTkZPICU+JSANCiAgICAgICAgICAgICAgICAgIHNlbGVjdCgtZmlsZV9uYW1lKSwNCiAgICAgICAgICAgICAgICBieSA9ICJjZWxsX2lkIikgJT4lIA0KICBsZWZ0X2pvaW4oY2VsbHJhbmtzICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGNlbGxfaWQsIGNoYW5nZV9yYW5rLCBhY3Rpdml0eV9jaGFuZ2UpLCANCiAgICAgICAgICAgIGJ5ID0gImNlbGxfaWQiKQ0KDQpkYXRhdGFibGUoVE9fUExPVCwNCiAgICAgICAgICBjYXB0aW9uID0gIlRPX1BMT1QgdGFibGUiLA0KICAgICAgICAgIHJvd25hbWVzID0gVFJVRSwgDQogICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDUwLCBzY3JvbGxYPVQsIHNjcm9sbFk9IjUwMHB4Iixkb20gPSAndCcpKQ0KYGBgDQo8YnI+PGJyPg0KDQojIyBQbG90dGluZw0KDQojIyMgQmFzZWxpbmUgdnMuICJiZWZvcmUiIHN0aW11bHVzIGFjdGl2aXR5DQoNCkNvbXBhcmlzb24gb2YgYmFzZWxpbmUgYW5kICJiZWZvcmUiIHN0aW11bHVzIGZpcmluZyByYXRlcyBpbiB0aGUgY2FzZSBvZiBzcG9udGFuZW91c2x5IGFjdGl2ZSBhbmQgc3BvbnRlbmVvdXNseSBpbmFjdGl2ZSAocGluY2gpIG5ldXJvbnMuIFNwb250YW5lb3VzbHkgaW5hY3RpdmUgbmV1cm9ucyBzaG93ZWQgc2lnbmlmaWNhbnRseSBoaWdoZXIgTUZSIGJlZm9yZSBzdGl1bHVzIGNvbXBhcmVkIHRvIGJhc2VsaW5lLg0KDQpgYGB7ciwgZmlnLndpZHRoPTEwLCBlY2hvID0gRkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoDQogIGRhdGEgPSBUT19QTE9UICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICBjb250cm9sID09IEYsDQogICAgICBzdGltX2NvbmQgPT0gImJhc2VsaW5lIiB8IHN0aW1fY29uZCA9PSAiYiINCiAgICApLA0KICBtYXBwaW5nID0gYWVzKA0KICAgIHggPSBmb3JjYXRzOjpmY3RfcmVsZXZlbChzdGltX2NvbmQsICJiYXNlbGluZSIsICJiIiksDQogICAgeSA9IE1GUg0KICApDQopICsNCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4yLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3BvaW50KGFlcyhmaWxsID0gcGluY2gpLA0KICAgIHNoYXBlID0gMjEsDQogICAgIyBmaWxsID0gIiNFQjgxMDQiLA0KICAgICMgY29sb3IgPSAid2hpdGUiLA0KICAgIHNpemUgPSA0DQogICkgKw0KICAjIHN0cm9rZSA9IDIpICsNCiAgZ2VvbV9saW5lKA0KICAgIGFlcyhncm91cCA9IGNlbGxfaWQsIGNvbCA9IHBpbmNoKQ0KICApICsNCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gMCkpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApDQogICkgKw0KICB4bGFiKCJSZWNvcmRpbmcgcGVyaW9kIikgKw0KICBmYWNldF93cmFwKHZhcnMocGluY2gpKSArDQogIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAid2lsY294LnRlc3QiLCBwYWlyZWQgPSBUKSArDQogICBnZW9tX2xhYmVsX3JlcGVsKA0KICAgIGRhdGEgPSBUT19QTE9UICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcigNCiAgICAgICAgY29udHJvbCA9PSBGLA0KICAgICAgICBzdGltX2NvbmQgPT0gImJhc2VsaW5lIg0KICAgICAgKSwNCiAgICBtYXBwaW5nID0gYWVzKGxhYmVsID0gY2VsbF9pZCksDQogICAgbnVkZ2VfeCA9IC0uOSwNCiAgICBkaXJlY3Rpb24gPSAieSIsDQogICAgIyBoanVzdCA9IDIsDQogICAgc2VnbWVudC5zaXplID0gLjINCiAgKQ0KIA0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyBNRlIgYmVmb3JlLCBkdXJpbmcgYW5kIGFmdGVyIHN0aW11bHVzIA0KDQpgYGB7ciwgZmlnLndpZHRoPTE0LCBmaWcuaGVpZ2h0PTEyICxlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KA0KICBkYXRhID0gVE9fUExPVCAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgY29udHJvbCA9PSBGLA0KICAgICAgc3RpbV9jb25kID09ICJiIiB8IHN0aW1fY29uZCA9PSAiZCIgfCBzdGltX2NvbmQgPT0gImEiDQogICAgKSwNCiAgbWFwcGluZyA9IGFlcygNCiAgICB4ID0gZm9yY2F0czo6ZmN0X3JlbGV2ZWwoc3RpbV9jb25kLCAiYiIsICJkIiwgImEiKSwNCiAgICB5ID0gTUZSDQogICkNCikgKw0KICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAwKSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkNCiAgKSArDQogIGdndGl0bGUoIlBpbmNoIiwpICsgDQogIHhsYWIoIlJlY29yZGluZyBwZXJpb2QiKSArDQogIHlsaW0oMCwgMzUpICsNCg0KICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjIsIGFscGhhID0gMC41KSArDQogIGdlb21fcG9pbnQoDQogICAgc2hhcGUgPSAyMSwNCiAgICBmaWxsID0gIiNFQjgxMDQiLA0KICAgICNjb2xvciA9ICJ3aGl0ZSIsDQogICAgc2l6ZSA9IDQNCiAgKSArDQogICMgc3Ryb2tlID0gMikgKw0KICBnZW9tX2xpbmUoDQogICAgYWVzKGdyb3VwID0gY2VsbF9pZCksIA0KICAgIGNvbG9yID0gIiNFQjgxMDQiDQogICkgKw0KICBnZW9tX2xhYmVsX3JlcGVsKA0KICAgIGRhdGEgPSAgVE9fUExPVCAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICAgIGNvbnRyb2wgPT0gRiwNCiAgICAgICAgc3RpbV9jb25kID09ICJhIg0KICAgICAgKSwNCiAgICBtYXBwaW5nID0gYWVzKGxhYmVsID0gY2VsbF9pZCksDQogICAgbnVkZ2VfeCA9IDAuMTUsDQogICAgZGlyZWN0aW9uID0gInkiLA0KICAgIGhqdXN0ID0gLTAuNSwNCiAgICBzZWdtZW50LnNpemUgPSAuMg0KICApICsNCiAgZmFjZXRfd3JhcCh2YXJzKHBpbmNoKSkNCmBgYA0KPGJyPjxicj4NCg0KIyMjIFN0cmVuZ3RoIG9mIGluaGliaXRpb24NCg0KRmlyaW5nIHJhdGUgY2hhbmdlICoqZHVyaW5nKiogc3RpbXVsdXMgKHBob3RvYWN0aXZhdGlvbiBvZiB0aGUgZ2x5Y2luZXJnaWMgZmliZXJzKSBjb21wYXJlZCB0byAqKmJhc2VsaW5lKio6DQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGVjaG89RkFMU0Usd2FybmluZz1GQUxTRX0NCmdncGxvdChkYXRhID0gY2VsbHJhbmtzLA0KICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IGNoYW5nZV9yYW5rLCB5ID0gYWN0aXZpdHlfY2hhbmdlKSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjZWxscmFua3MgJT4lIA0KICAgICAgICAgICAgICAgZHBseXI6OmZpbHRlcihjb250cm9sID09IEYpLHNpemUgPSAzKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNlbGxyYW5rcyAlPiUgDQogICAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGNvbnRyb2wgPT0gVCksIHNpemUgPSAzLCBjb2wgPSAibWFnZW50YSIpICsNCiAgIyMjIGxhYmVsIGZvciBuZWdhdGl2ZSB2YWx1ZXMNCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBjZWxscmFua3MgJT4lIA0KICAgICAgICAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGFjdGl2aXR5X2NoYW5nZSA8IDApLA0KICAgIGFlcyhsYWJlbCA9IGNlbGxfaWQpLA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICBhbmdsZSA9IDkwLA0KICAgIGhqdXN0ID0gLjUsDQogICAgbnVkZ2VfeSA9IC0yDQogICAgKSArDQogIA0KICAjIyMgbGFiZWwgZm9yIHBvc2l0aXZlIHZhbHVlcw0KICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IGNlbGxyYW5rcyAlPiUgDQogICAgICAgICAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoYWN0aXZpdHlfY2hhbmdlID4gMCksDQogICAgYWVzKGxhYmVsID0gY2VsbF9pZCksDQogICAgZGlyZWN0aW9uID0gIngiLA0KICAgIGFuZ2xlID0gMCwNCiAgICBoanVzdCA9IC41LA0KICAgIG51ZGdlX3ggPSAtMQ0KICAgICkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleSIsIGx0eSA9ICJkYXNoZWQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDI3LCB5ID0gLTE3LCBsYWJlbCA9ICJCYXNlbGluZSBhY3Rpdml0eSIsIGNvbCA9ICJncmF5IikgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleSIsIGx0eSA9ICJkYXNoZWQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0yLCB5ID0gMjgwLCBsYWJlbCA9ICJOZWdhdGl2ZSByYW5rOiBGUiBkZWNyZWFzZSIsIGNvbCA9ICJncmF5IiwgYW5nbGUgPSA5MCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAyLCB5ID0gMjgwLCBsYWJlbCA9ICJQb3NpdGl2ZSByYW5rOiBGUiBpbmNyZWFzZSIsIGNvbCA9ICJncmF5IiwgYW5nbGUgPSA5MCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKyANCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApDQogICkgKw0KICB5bGltKC1tYXgoY2VsbHJhbmtzJGFjdGl2aXR5X2NoYW5nZSksbWF4KGNlbGxyYW5rcyRhY3Rpdml0eV9jaGFuZ2UpKQ0KDQpgYGANCg0KPGJyPjxicj4NCg0KRmlyaW5nIHJhdGUgY2hhbmdlICoqZHVyaW5nKiogc3RpbXVsdXMgKHBob3RvYWN0aXZhdGlvbiBvZiB0aGUgZ2x5Y2luZXJnaWMgZmliZXJzKSBjb21wYXJlZCB0byAqKmJlZm9yZSoqIHN0aW11bHVzOg0KDQpgYGB7ciwgZmlnLndpZHRoPTEwLCBlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQoNCmdncGxvdChkYXRhID0gY2VsbHJhbmtzX2JlZm9yZV9zdGltLA0KICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IGNoYW5nZV9yYW5rLCB5ID0gYWN0aXZpdHlfY2hhbmdlKSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjZWxscmFua3NfYmVmb3JlX3N0aW0gJT4lIA0KICAgICAgICAgICAgICAgZHBseXI6OmZpbHRlcihjb250cm9sID09IEYpLHNpemUgPSA2LA0KICAgICAgICAgICAgIGFlcyhjb2wgPSBwb3NpdGlvbiwNCiAgICAgICAgICAgICAgICAgc2hhcGUgPSBwaW5jaCkNCiAgICAgICAgICAgICApICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIklMIiA9ICJncmVlbiIsICJ0cmFuc2llbnQiID0gImJsdWUiLCAiUEYiID0gInJlZCIsICJ1bmtub3duIiA9ICJibGFjayIsICJjb250cm9sIiA9ICJtYWdlbnRhIikpICsgDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJUUlVFIiA9ICIrIiwgIkZBTFNFIiA9ICItIikpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gY2VsbHJhbmtzX2JlZm9yZV9zdGltICU+JQ0KICAgICAgICAgICAgICAgZHBseXI6OmZpbHRlcihjb250cm9sID09IFQpLCBzaXplID0gMywgY29sID0gIm1hZ2VudGEiKSArDQogICMjIyBsYWJlbCBmb3IgbmVnYXRpdmUgdmFsdWVzDQogIGdlb21fdGV4dF9yZXBlbChkYXRhID0gY2VsbHJhbmtzX2JlZm9yZV9zdGltICU+JSANCiAgICAgICAgICAgICAgICAgICAgZHBseXI6OmZpbHRlcihhY3Rpdml0eV9jaGFuZ2UgPCAwKSwNCiAgICBhZXMobGFiZWwgPSBjZWxsX2lkKSwNCiAgICBkaXJlY3Rpb24gPSAieSIsDQogICAgYW5nbGUgPSA5MCwNCiAgICBoanVzdCA9IC41LA0KICAgIG51ZGdlX3kgPSAtMg0KICAgICkgKw0KICANCiAgIyMjIGxhYmVsIGZvciBwb3NpdGl2ZSB2YWx1ZXMNCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBjZWxscmFua3NfYmVmb3JlX3N0aW0gJT4lIA0KICAgICAgICAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGFjdGl2aXR5X2NoYW5nZSA+IDApLA0KICAgIGFlcyhsYWJlbCA9IGNlbGxfaWQpLA0KICAgIGRpcmVjdGlvbiA9ICJ4IiwNCiAgICBhbmdsZSA9IDAsDQogICAgaGp1c3QgPSAuNSwNCiAgICBudWRnZV94ID0gLTENCiAgICApICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sID0gImdyZXkiLCBsdHkgPSAiZGFzaGVkIikgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAyNywgeSA9IC0xNywgbGFiZWwgPSAiQmFzZWxpbmUgYWN0aXZpdHkiLCBjb2wgPSAiZ3JheSIpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sID0gImdyZXkiLCBsdHkgPSAiZGFzaGVkIikgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAtMiwgeSA9IDI4MCwgbGFiZWwgPSAiTmVnYXRpdmUgcmFuazogRlIgZGVjcmVhc2UiLCBjb2wgPSAiZ3JheSIsIGFuZ2xlID0gOTApICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMiwgeSA9IDI4MCwgbGFiZWwgPSAiUG9zaXRpdmUgcmFuazogRlIgaW5jcmVhc2UiLCBjb2wgPSAiZ3JheSIsIGFuZ2xlID0gOTApICsNCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIHRoZW1lKA0KICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKQ0KICApICsNCiAgeGxhYigiUmFua3MiKSArDQogIHlsYWIoIkNoYW5nZSBpbiBmaXJpbmcgcmF0ZSBbJV0iKSArDQogIHlsaW0oLW1heChjZWxscmFua3NfYmVmb3JlX3N0aW0kYWN0aXZpdHlfY2hhbmdlKSxtYXgoY2VsbHJhbmtzX2JlZm9yZV9zdGltJGFjdGl2aXR5X2NoYW5nZSkpIA0KDQoNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KPGJyPjxicj4NCg0KUGxvdHRpbmcgdGhlIGNoYW5nZSBpbiBNRlIgZnJvbSAiKmJhc2VsaW5lKiIgdG8gIipkdXJpbmcgc3RpbXVsdXMqIi4gQ29sb3JpbmcgYmFzZWQgb24gdGhlIHN0cmVuZ3RoIG9mIHRoZSBpbmhpYml0aW9uICgqcmFuayopDQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTIsIGVjaG89RkFMU0Usd2FybmluZz1GQUxTRX0NCmdncGxvdCgNCiAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGNvbnRyb2wgPT0gRiwNCiAgICAgIHN0aW1fY29uZCA9PSAiYmFzZWxpbmUiIHwgc3RpbV9jb25kID09ICJkIg0KICAgICksDQogIG1hcHBpbmcgPSBhZXMoDQogICAgeCA9IGZvcmNhdHM6OmZjdF9yZWxldmVsKHN0aW1fY29uZCwgImJhc2VsaW5lIiwgImQiLCAiYSIpLA0KICAgIHkgPSBNRlINCiAgKQ0KKSArDQogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IGNoYW5nZV9yYW5rKSwNCiAgICBzaGFwZSA9IDIxLA0KICAgICMgZmlsbCA9ICIjRUI4MTA0IiwNCiAgICAjIGNvbG9yID0gIndoaXRlIiwNCiAgICBzaXplID0gNA0KICApICsNCiAgIyBzdHJva2UgPSAyKSArDQogIGdlb21fbGluZSgNCiAgICBhZXMoZ3JvdXAgPSBjZWxsX2lkLCBjb2wgPSBjaGFuZ2VfcmFuaykNCiAgKSArDQogIGdlb21fbGFiZWxfcmVwZWwoDQogICAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgICBjb250cm9sID09IEYsDQogICAgICAgIHN0aW1fY29uZCA9PSAiYmFzZWxpbmUiDQogICAgICApLA0KICAgIG1hcHBpbmcgPSBhZXMobGFiZWwgPSBjZWxsX2lkLCBjb2wgPSBjaGFuZ2VfcmFuayksDQogICAgI251ZGdlX3ggPSAtLjEsDQogICAgZGlyZWN0aW9uID0gInkiLA0KICAgIGhqdXN0ID0gNCwNCiAgICBzZWdtZW50LnNpemUgPSAuMg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApDQogICkgKw0KICB4bGFiKCJSZWNvcmRpbmcgcGVyaW9kIikgKw0KICBsYWJzKGZpbGwgPSAiUmFuayIgLGNvbCA9ICJSYW5rIikNCg0KYGBgDQoNCg0KPGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+DQoNCg0KIyBBY3Rpdml0eSBvZiBQUkYgZ2x5Y2luZXJnaWMgY2VsbHMgZHVyaW5nIFBGQyBwaG90b2FjdGl2YXRpb24NCg0KIyMgTG9hZGluZyBhbmQgdHJhbnNmb3JtaW5nIChoaWRkZW4gY29kZSkgZGF0YQ0KDQoNCmBgYHtyIGxvYWRpbmcgZGF0YSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnNvdXJjZShmaWxlLnBhdGgoInN1cHBsZW1lbnRhcnlfZnVuY3Rpb25zIiwgIkNyZWF0ZVJlY1RpYmJsZS5SIikpDQpSRUNPUkRJTkdTIDwtIENyZWF0ZVJlY1RpYmJsZSgNCiAgQVBfdGltZXMgPSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiY29ydGljYWxfc3RpbSIsICJBUF90aW1lcy5jc3YiKSksDQogIHN0aW1fdGltZXMgPSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiY29ydGljYWxfc3RpbSIsICJzdGltX3RpbWVzLmNzdiIpKQ0KKQ0KDQpTVElNX1JFU1VMVFMgPC0gcmVhZF9jc3YoZmlsZS5wYXRoKCJvdXRwdXRfZGF0YSIsICJjb3J0aWNhbF9zdGltX2FuYWx5c2lzLmNzdiIpKQ0KYGBgDQoNCg0KYGBge3IgdHJhbnNmb3JtaW5nIGRhdGEsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgYWRkaW5nIHN0aW11bHVzIG51bWJlciB3aXRoaW4gdHJhaW4NClJFQ09SRElOR1MgPC0gUkVDT1JESU5HUyAlPiUNCiAgbXV0YXRlKHN0aW1fbnVtYmVyID0gMCkNCg0KIyMjIGNhbGN1bGF0aW5nIHN0aW11bHVzIG51bWJlciB3aXRoaW4gdHJhaW4gDQppbml0aWFsX3ZhbHVlIDwtIFJFQ09SRElOR1Mkc3RpbV9mcmVxWzFdICU+JSANCiAgYGNvbW1lbnQ8LWAoIkZpcnN0IHZhbHVlIG9mIHN0aW1fZnJlcSB2YXJpYWJsZS4gV2hlbiBpdCBjaGFuZ2VzIHN0aW11bHVzIGNvdW50aW5nIHJlc3RhcnRzIikNCg0Kc3RpbV9jb3VudGVyIDwtIDEgJT4lIA0KICBgY29tbWVudDwtYCgiQ291bnRzIHN0aW11bGkgaW4gYSB0cmFpbiIpDQppbmRleCA8LSAxICU+JSANCiAgYGNvbW1lbnQ8LWAoIlRyYWNrcyB0aGUgcG9zaXRpb24gKGluZGV4KSBvZiBzdGltX2ZyZXEiKQ0KDQpSRUNPUkRJTkdTJHN0aW1fbnVtYmVyWzFdIDwtIHN0aW1fY291bnRlcg0KcmVwZWF0ew0KICBpZiAoUkVDT1JESU5HUyRzdGltX2ZyZXFbaW5kZXggKyAxXSA9PSBpbml0aWFsX3ZhbHVlKSB7DQogICAgUkVDT1JESU5HUyRzdGltX251bWJlcltpbmRleCArIDFdIDwtIHN0aW1fY291bnRlciArIDENCiAgICBzdGltX2NvdW50ZXIgPC0gc3RpbV9jb3VudGVyICsgMQ0KICAgIGluZGV4IDwtIGluZGV4ICsgMQ0KICB9IGVsc2Ugew0KICAgIGluaXRpYWxfdmFsdWUgPC0gUkVDT1JESU5HUyRzdGltX2ZyZXFbaW5kZXggKyAxXQ0KICAgIHN0aW1fY291bnRlciA8LSAxDQogICAgUkVDT1JESU5HUyRzdGltX251bWJlcltpbmRleCArIDFdIDwtIHN0aW1fY291bnRlcg0KICAgIGluZGV4IDwtIGluZGV4ICsgMQ0KICB9DQogIA0KICBpZiAoaW5kZXggPT0gbGVuZ3RoKFJFQ09SRElOR1Mkc3RpbV9udW1iZXIpKSB7DQogICAgYnJlYWsNCiAgfQ0KfQ0KDQojIyMgcmVwbGFjaW5nIHN0aW1fbnVtYmVyIHdpdGggTkEgYXQgIkFQIg0KUkVDT1JESU5HUyRzdGltX251bWJlcltSRUNPUkRJTkdTJHNpZ25hbF90eXBlID09ICJBUCJdIDwtIE5BDQoNCiMjIyBjYXRlZ29yaXppbmcgc3RpbXVsaQ0KUkVDT1JESU5HUyA8LSBSRUNPUkRJTkdTICU+JQ0KICBtdXRhdGUoc3RpbV9mcmVxX2NhdGVnID0gc3RpbV9mcmVxKSAlPiUNCiAgbXV0YXRlKHN0aW1fZnJlcV9jYXRlZyA9IHJlcGxhY2UoDQogICAgeCA9IHN0aW1fZnJlcV9jYXRlZywNCiAgICBsaXN0ID0gKHN0aW1fZnJlcV9jYXRlZyA9PSAxMiB8IHN0aW1fZnJlcV9jYXRlZyA9PSA4KSwNCiAgICB2YWx1ZXMgPSAxMA0KICApKSAlPiUNCiAgbXV0YXRlKHN0aW1fZnJlcV9jYXRlZyA9IHJlcGxhY2UoDQogICAgeCA9IHN0aW1fZnJlcV9jYXRlZywNCiAgICBsaXN0ID0gKHN0aW1fZnJlcV9jYXRlZyA9PSAxOCksDQogICAgdmFsdWVzID0gMjANCiAgKSkNCg0KYGBgDQoNCiogTGlzdCBvZiB0aWJibGVzIHVzZWQgdG8gc3RvcmUgZGF0YToNCiAgKyBSRUNPUkRJTkdTIHRpYmJsZTogc3RvcmVzIEFQIGFuZCBzdGltIHRpbWUgc3RhbXBzLCBudW1iZXIgb2Ygc3RpbXVsaSBpbiBlYWNoIHRyYWluLCBzdGltdWx1cyBmcmVxdWVuY3kgY2F0ZWdvcmllcyAoZWcuIDggMTAgYW5kIDEyIEh6IGJlbG9uZyB0byAxMCBIeiBjYXRlZ29yeSkNCiAgKyBTVElNX1JFU1VMVFM6IHN0b3JlcyB0aGUgZGF0YSBmb3IgUFNUSHMgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgdGlkeT1UUlVFfQ0KZGF0YXRhYmxlKFJFQ09SRElOR1MsIA0KICAgICAgICAgIGNhcHRpb24gPSJSRUNPUkRJTkdTIHRpYmJsZSIsIA0KICAgICAgICAgIHJvd25hbWVzID0gVFJVRSwgDQogICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDUwLCBzY3JvbGxYPVQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAndCcpKQ0KDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCB0aWR5PVRSVUV9DQpkYXRhdGFibGUoU1RJTV9SRVNVTFRTLCANCiAgICAgICAgICBjYXB0aW9uID0iU1RJTV9SRVNVTFRTIHRpYmJsZSIsIA0KICAgICAgICAgIHJvd25hbWVzID0gVFJVRSwgDQogICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDUwLCBzY3JvbGxYPVQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAndCcpKQ0KDQpgYGANCg0KIyMgUGxvdHRpbmcNCg0KIyMjIERpc3RyaWJ1dGlvbiBvZiBmcmlzdCBBUHMgYWZ0ZXIgY29ydGljYWwgYWN0aXZhdGlvbg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0Kc291cmNlKGZpbGUucGF0aCgic3VwcGxlbWVudGFyeV9mdW5jdGlvbnMiLCAiZ2VvbV9mbGF0X3Zpb2xpbi5SIikpDQpQU1RIX3JhbmdlIDwtIGMoMCwgMC4wNSkNCmdwX2JveF8xIDwtIGdncGxvdCgNCiAgZGF0YSA9IFNUSU1fUkVTVUxUUyAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgZmlyc3RfYXBfcmVsdGltZXMgPiBQU1RIX3JhbmdlWzFdLA0KICAgICAgZmlyc3RfYXBfcmVsdGltZXMgPCBQU1RIX3JhbmdlWzJdLA0KICAgICAgZnJlcSA9PSAxDQogICAgKSwNCiAgbWFwcGluZyA9IGFlcyh5ID0gZmlyc3RfYXBfcmVsdGltZXMsIHggPSBhbmltYWxfaWQpDQopICsNCiAgY29vcmRfZmxpcCgpICsNCiAgZ2doYWx2ZXM6Omdlb21faGFsZl92aW9saW4oc2lkZSA9ICJyIiwgdHJpbSA9IFQsIHNjYWxlID0gIndpZHRoIikgKw0KICAjIGdlb21fZG90cGxvdChiaW5heGlzID0gInkiLCANCiAgIyAgICAgICAgICAgICAgZG90c2l6ZSA9IDQsIA0KICAjICAgICAgICAgICAgICBzdGFja2RpciA9ICJkb3duIiwgDQogICMgICAgICAgICAgICAgIGJpbndpZHRoID0gMC4wMDAyLG1ldGhvZCA9ICJoaXN0b2RvdCIsYmlucG9zaXRpb25zID0gImFsbCIsDQogICMgICAgICAgICAgICAgICkgKw0KICAjIHNlZTo6Z2VvbV92aW9saW5kb3QoYmlud2lkdGggPSAwLjAwMDEsc2l6ZV9kb3RzID0gNiwpICsNCiAgZ2VvbV9qaXR0ZXIocG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIoMCksIHNoYXBlID0gInwiKSArDQogICMgZ2VvbV9ib3hwbG90KHdpZHRoID0gLjEsIG91dGxpZXIuY29sb3VyID0gTkEsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArDQogIGdndGl0bGUoIjEgSHoiKQ0KDQpncF9ib3hfMTAgPC0gZ2dwbG90KA0KICBkYXRhID0gU1RJTV9SRVNVTFRTICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICBmaXJzdF9hcF9yZWx0aW1lcyA+IFBTVEhfcmFuZ2VbMV0sDQogICAgICBmaXJzdF9hcF9yZWx0aW1lcyA8IFBTVEhfcmFuZ2VbMl0sDQogICAgICBmcmVxID09IDgNCiAgICApLA0KICBtYXBwaW5nID0gYWVzKHkgPSBmaXJzdF9hcF9yZWx0aW1lcywgeCA9IGFuaW1hbF9pZCkNCikgKw0KICAjIGdlb21fZG90cGxvdChiaW5heGlzID0gInkiLCBkb3RzaXplID0gMC41LCBzdGFja2RpciA9ICJ1cCIsIGJpbndpZHRoID0gMC4wMDEpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgZ2VvbV9oYWxmX3Zpb2xpbihzaWRlID0gInIiLCB0cmltID0gVCwgc2NhbGUgPSAid2lkdGgiKSArDQogIGdlb21faml0dGVyKHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKDApLCBzaGFwZSA9ICJ8IikgKw0KICAjIGdlb21fZmxhdF92aW9saW4oKSArDQogICMgZ2VvbV9ib3hwbG90KHdpZHRoID0gLjEsIG91dGxpZXIuY29sb3VyID0gTkEsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArDQogIGdndGl0bGUoIjEwIEh6IikNCg0KZ3BfYm94XzIwIDwtIGdncGxvdCgNCiAgZGF0YSA9IFNUSU1fUkVTVUxUUyAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgZmlyc3RfYXBfcmVsdGltZXMgPiBQU1RIX3JhbmdlWzFdLA0KICAgICAgZmlyc3RfYXBfcmVsdGltZXMgPCBQU1RIX3JhbmdlWzJdLA0KICAgICAgZnJlcSA9PSAxOA0KICAgICksDQogIG1hcHBpbmcgPSBhZXMoeSA9IGZpcnN0X2FwX3JlbHRpbWVzLCB4ID0gYW5pbWFsX2lkKQ0KKSArDQogICMgZ2VvbV9kb3RwbG90KGJpbmF4aXMgPSAieSIsIGRvdHNpemUgPSAwLjUsIHN0YWNrZGlyID0gInVwIiwgYmlud2lkdGggPSAwLjAwMSkgKw0KICBjb29yZF9mbGlwKCkgKw0KICBnZW9tX2hhbGZfdmlvbGluKHNpZGUgPSAiciIsIHRyaW0gPSBULCBzY2FsZSA9ICJ3aWR0aCIpICsNCiAgZ2VvbV9qaXR0ZXIocG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIoMCksIHNoYXBlID0gInwiKSArDQogICMgZ2VvbV9mbGF0X3Zpb2xpbigpICsNCiAgIyBnZW9tX2JveHBsb3Qod2lkdGggPSAuMSwgb3V0bGllci5jb2xvdXIgPSBOQSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsNCiAgZ2d0aXRsZSgiMjAgSHoiKQ0KDQpzb3VyY2UoZmlsZS5wYXRoKCJzdXBwbGVtZW50YXJ5X2Z1bmN0aW9ucyIsICJtdWx0aXBsb3QuUiIpKQ0KbXVsdGlwbG90KGdwX2JveF8xLCBncF9ib3hfMTAsIGdwX2JveF8yMCwgY29scyA9IDMpDQpgYGANCg0KDQoNCiMgU3BvbnRhbmVvdXMgZGVzeW5jaHJvbml6YXRpb24gb2YgdGhlIEZDIHNsb3cgb3NjaWxsYXRpb24gDQoNCg0KDQpgYGB7ciwgIGVjaG89RkFMU0Usd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KZmlsZV9saXN0IDwtIGxpc3QuZmlsZXMoDQogIHBhdGggPSAiZGF0YSIsDQogIHBhdHRlcm4gPSAiKi5tYXQiLCBmdWxsLm5hbWVzID0gRiwgcmVjdXJzaXZlID0gRg0KKQ0KDQpgYGANCg0KDQpgYGB7cn0NCmZpbGVfdG9fbG9hZCA8LSBmaWxlX2xpc3RbWzFdXQ0KZmlsZW5hbWUgPC0gYXMuY2hhcmFjdGVyKHN1YnN0cmluZyhmaWxlX3RvX2xvYWQsIDEsIG5jaGFyKGZpbGVfdG9fbG9hZCkgLSA0KSkNCnJhdy5yZWMgPC0gcmVhZE1hdChmaWxlLnBhdGgoImRhdGEiLCBmaWxlX3RvX2xvYWQpKQ0KDQojIyN0YWtlcyB0aGUgZmlyc3QgQVAgKGZpcnN0IHJvdykgYW5kIHRlbGxzIHRoZSBpbmRleCBvZiBwb2ludCB3aXRoIHRoZSBtYXggdmFsdWUNCnBvaW50c190b19wZWFrIDwtIHdoaWNoKHJhdy5yZWMkYXBbLCAsIDFdJHZhbHVlc1sxLCBdID09DQogICAgbWF4KHJhdy5yZWMkYXBbLCAsIDFdJHZhbHVlc1sxLCBdKSkgJT4lDQogICAgYXMubnVtZXJpYygpDQoNCiMjIyB0aW1lIG9mIHRoZSBwZWFrIG9mIHRoZSBBUHMgYWZ0ZXIgaXRzIGZpcnN0IHBvaW50DQpyYXcucmVjJGFwWywgLCAxXSRpbnRlcnZhbCAqIHBvaW50c190b19wZWFrDQoNCmFwIDwtIHJhdy5yZWMkYXBbLCAsIDFdJHRpbWVzICU+JSBhcy5kb3VibGUoKQ0KYXBfcGVha3MgPC0gdGliYmxlKHBlYWtfdGltZXMgPSAoYXAgKyBjKHJhdy5yZWMkYXBbLCAsIDFdJGludGVydmFsICogcG9pbnRzX3RvX3BlYWspKSkNCg0KDQpgYGANCg0KDQotLS0tLS0tIGluc2VydCBjb2RlIGhlcmUgLS0tLS0tLS0NCiANCihzcG9udF9kZXN5bmNocm9uX2FuYWx5c2lzLlIpLCA3IHJlY29yZGluZ3MNCg0KIyBUZXJtaW5hbHMNCg0KIyMgTG9hZGluZyBkYXRhDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHRpZHk9VFJVRX0NCmZpbGVfcGF0aCA8LSBmaWxlLnBhdGgoJ2RhdGEnLA0KICAgICAgICAgICAgICAgICAgICAgICAnRW1pX3Rlcm1pbmFscycsDQogICAgICAgICAgICAgICAgICAgICAgICd0ZXJtaW5hbF9tZWFzdXJlcy5jc3YnICkgIA0KVEVSTUlOQUxTIDwtIHJlYWQudGFibGUoZmlsZSA9IGZpbGVfcGF0aCwgc2VwID0gJzsnLCBoZWFkZXIgPSBULCBuYS5zdHJpbmcgPSAnbmEnKQ0KaGVhZChURVJNSU5BTFMpDQoNCmBgYA0KDQojIyBCb3V0b24gYXJlYSBvbiBkaWZmZXJlbnQgZGVuZHJpdGljIGRvbWFpbnMNCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KGRhdGEgPSBURVJNSU5BTFMsIG1hcHBpbmcgPSBhZXMoeCA9IHBvc3Rpb24sIHkgPSBiX2FyZWEpKSArDQogIGdlb21faGFsZl92aW9saW4ocG9zaXRpb24gPSBwb3NpdGlvbl9udWRnZSh4PS0uMTUpLA0KICAgICAgICAgICAgICAgICAgdHJpbSA9IEYsDQogICAgICAgICAgICAgICAgICBzaWRlID0gImwiLA0KICAgICAgICAgICAgICAgICAgc2NhbGUgPSAiYXJlYSIsDQogICAgICAgICAgICAgICAgICBkcmF3X3F1YW50aWxlcyA9IGMoMC41KSwNCiAgICAgICAgICAgICAgICAgIGFlcyhmaWxsID0gcG9zdGlvbikpICsNCiAgZ2VvbV9qaXR0ZXIocG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIoMC4xKSkNCg0KYGBgDQoNCiMjIEFyZWEgb2YgYm91dG9ucyB3aXRoICptMiogYW5kICp1bmtub3duKiBvcmlnaW4NCg0KYGBge3IgZmlnLndpZHRoPTEwLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KZ2dwbG90KGRhdGEgPSBURVJNSU5BTFMsDQogICAgICAgbWFwcGluZyA9IGFlcyh4ID0gb3JpZ2luLCB5ID0gYl9hcmVhKSkgKw0KICBnZW9tX2hhbGZfdmlvbGluKHBvc2l0aW9uID0gcG9zaXRpb25fbnVkZ2UoeD0tLjE1KSwNCiAgICAgICAgICAgICAgICAgICB0cmltID0gRiwNCiAgICAgICAgICAgICAgICAgICBzaWRlID0gImwiLA0KICAgICAgICAgICAgICAgICAgIHNjYWxlID0gImNvdW50IiwNCiAgICAgICAgICAgICAgICAgICBkcmF3X3F1YW50aWxlcyA9IGMoMC41KQ0KICAgICAgICAgICAgICAgICAgICNmaWxsID0gYWxwaGEoMC4xKSwNCiAgICAgICAgICAgICAgICAgICAjYWVzKGNvbCA9IHBvc3Rpb24pDQogICAgICAgICAgICAgICAgICAgKSArDQogIGdlb21faml0dGVyKHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKDAuMSksDQogICAgICAgICAgICAgIGFlcyhjb2wgPSBwb3N0aW9uKSkgKw0KICBhbm5vdGF0ZSgidGV4dCIsDQogICAgICAgICAgIHggPSAwLjcsIA0KICAgICAgICAgICB5ID0gMSwgDQogICAgICAgICAgIGxhYmVsID0gcGFzdGUoIm4gPSAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBURVJNSU5BTFMgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9ieShvcmlnaW4pICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShuID0gbGVuZ3RoKGJfYXJlYSkpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OmZpbHRlcihvcmlnaW4gPT0gIm0yIikgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KG4pICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKCkpDQogICAgICAgICAgICkgKw0KICBhbm5vdGF0ZSgidGV4dCIsDQogICAgICAgICAgIHggPSAxLjYsIA0KICAgICAgICAgICB5ID0gMSwgDQogICAgICAgICAgIGxhYmVsID0gcGFzdGUoIm4gPSAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBURVJNSU5BTFMgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9ieShvcmlnaW4pICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShuID0gbGVuZ3RoKGJfYXJlYSkpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OmZpbHRlcihvcmlnaW4gPT0gInVua25vd24iKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QobikgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIoKSkNCiAgKQ0KYGBgDQoNCg==